package com.biyao.service.model.oauth.imp;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import java.util.HashMap;
import java.util.Map;

import com.biyao.schedulingdao.oauth.TOauthAccessTokenMapper;
import com.biyao.schedulingentity.oauth.TOauthAccessTokenEntity;
import com.biyao.service.model.oauth.OauthService;
import org.apache.oltu.oauth2.as.issuer.MD5Generator;
import org.apache.oltu.oauth2.as.issuer.OAuthIssuerImpl;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.ArrayList;

/**
 * 
 *
 * @author code generator
 * @date 2019-09-16 13:57:43
 */
@Service
public class TOauthAccessTokenService extends ServiceImpl<TOauthAccessTokenMapper, TOauthAccessTokenEntity> implements OauthService {

    public Page list(int pageNum, int pageSize){

        EntityWrapper<TOauthAccessTokenEntity> tOauthAccessTokenentityWrapper=new EntityWrapper<>();
        Page page=selectPage(new Page(pageNum,pageSize),tOauthAccessTokenentityWrapper);
        page.setRecords(formatRecords(page.getRecords()));
        return page;
    }

    List formatRecords(List<TOauthAccessTokenEntity> list){
        List resList=new ArrayList();
        for(TOauthAccessTokenEntity tOauthAccessTokenEntity:list){
            Map map=formatEntity(tOauthAccessTokenEntity);
            resList.add(map);
        }
        return resList;
    }

    Map formatEntity(TOauthAccessTokenEntity tOauthAccessTokenEntity){
        Map map=new HashMap(16);
        //
        if(tOauthAccessTokenEntity.getId()!=null){
           map.put("id",tOauthAccessTokenEntity.getId());
        }
        //token所属人id
        if(tOauthAccessTokenEntity.getResourceOwnerId()!=null){
           map.put("resourceOwnerId",tOauthAccessTokenEntity.getResourceOwnerId());
        }
        //
        if(tOauthAccessTokenEntity.getAccessToken()!=null){
           map.put("accessToken",tOauthAccessTokenEntity.getAccessToken());
        }
        //
        if(tOauthAccessTokenEntity.getRefreshToken()!=null){
           map.put("refreshToken",tOauthAccessTokenEntity.getRefreshToken());
        }
        //有效时长
        if(tOauthAccessTokenEntity.getExpiresIn()!=null){
           map.put("expiresIn",tOauthAccessTokenEntity.getExpiresIn());
        }
        //过期时间
        if(tOauthAccessTokenEntity.getRevokedAt()!=null){
           map.put("revokedAt",tOauthAccessTokenEntity.getRevokedAt());
        }
        //创建时间
        if(tOauthAccessTokenEntity.getCreatedAt()!=null){
           map.put("createdAt",tOauthAccessTokenEntity.getCreatedAt());
        }
        //可用应用范围企业管理员是enterprise
        if(tOauthAccessTokenEntity.getScope()!=null){
           map.put("scope",tOauthAccessTokenEntity.getScope());
        }
        //1web端登录 2app端登录3企业管理员
        if(tOauthAccessTokenEntity.getType()!=null){
           map.put("type",tOauthAccessTokenEntity.getType());
        }
        //记录同时登录的设备数
        if(tOauthAccessTokenEntity.getCount()!=null){
           map.put("count",tOauthAccessTokenEntity.getCount());
        }
        //merchant_app表 id列
        if(tOauthAccessTokenEntity.getMerchantAppId()!=null){
           map.put("merchantAppId",tOauthAccessTokenEntity.getMerchantAppId());
        }
        return map;
    }

    @Override
    public TOauthAccessTokenEntity getTokenByAccessTokenAndScope(String accessToken) {
        EntityWrapper entityWrapper = new EntityWrapper();
        entityWrapper.eq("access_token", accessToken);
        return selectOne(entityWrapper);
    }

    @Override
    public TOauthAccessTokenEntity generateToken(Integer resourceOwnerId) {
        OAuthIssuerImpl authIssuerImpl = new OAuthIssuerImpl(new MD5Generator());
        String accessToken = null;
        String refreshToken = null;
        try {
            accessToken = authIssuerImpl.accessToken();
            refreshToken = authIssuerImpl.refreshToken();
        } catch (Exception e) {
            e.printStackTrace();
        }

        deleteOauthAccessTokenByResourceOwnerIdAndScope(resourceOwnerId);

        TOauthAccessTokenEntity oauthAccessToken = new TOauthAccessTokenEntity();
        oauthAccessToken.setAccessToken(accessToken);
        oauthAccessToken.setRefreshToken(refreshToken);
        oauthAccessToken.setResourceOwnerId(resourceOwnerId);
        oauthAccessToken.setExpiresIn(518400000);
        insert(oauthAccessToken);
        return oauthAccessToken;
    }

    private void deleteOauthAccessTokenByResourceOwnerIdAndScope(Integer resourceOwnerId) {
        EntityWrapper entityWrapper = new EntityWrapper();
        entityWrapper.eq("resource_owner_id", resourceOwnerId);
        delete(entityWrapper);
    }
}

